class Scheduler {
    constructor(limit) {
        this.limit = limit
        this.queue = []
        this.count = 0
    }
    add(time, str) {
        const request = () => {
            return new Promise(resolve => {
                setTimeout(() => {
                    console.log(str)
                    resolve()
                }, time)
            })
        }
        this.queue.push(request)
    }
    taskStart() {
        for (let i = 0; i < this.limit; i++) {
            this.request()
        }
    }

    request() {
        if (!this.queue.length || this.count > this.limit) {
            return
        }
        this.count++
        this.queue.shift()().then(() => {
            this.count--
            this.request()
        })
    }
}

let task = new Scheduler(2)
task.add(1000,'1');
task.add(500,'2');
task.add(300,'3');
task.add(4000,'4');
task.taskStart()
task.add(4000,'5');
task.add(4000,'6');
// 的输出顺序是：2 3 1 4

// 整个的完整执行流程：

// 一开始1、2两个任务开始执行
// 500ms时，2任务执行完毕，输出2，任务3开始执行
// 800ms时，3任务执行完毕，输出3，任务4开始执行
// 1000ms时，1任务执行完毕，输出1，此时只剩下4任务在执行
// 1200ms时，4任务执行完毕，输出4